iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
自我挑戰組

從HTML到Python爬蟲的30天之旅系列 第 19

Day 19:專案03 - PTT 八卦版爬蟲04 | 留言、換頁、json

  • 分享至 

  • xImage
  •  

各位早阿,今天就接續昨天的部分,繼續抓取留言和匯出成json檔吧!

留言區

觀察一下PTT的留言區,可以看到留言分成三種,分別是"推"、"噓"和"→",每則留言都有標籤、作者、內容和時間這些資訊,接下來就是要取得這些資訊並依照標籤分類。

隨便對一則留言右鍵>>檢查,發現留言是在class="push"<div>內,資訊則分別在class="push-tag"、"push-userid"、"push-content"、"push-ipdatetime"中。

因此程式碼就很單純:

# 抓出所有留言
comments = main_content.find_all("div", class_="push")
for comment in comments:
    push_tag = comment.find(
        "span", class_="push-tag").string   # 分類標籤
    push_userid = comment.find(
        "span", class_="push-userid").string  # 使用者ID
    push_content = comment.find(
        "span", class_="push-content").string   # 留言內容
    push_time = comment.find(
        "span", class_="push-ipdatetime").string   # 留言時間

為了分類,我建立三個list,分別存放"推"、"→"、"噓"三種標籤。

push_dic = []
arrow_dic = []
shu_dic = []

再來就用字典型式將所有資料塞好塞滿,然後再依照標籤分類就好囉~

dict1 = {"push_userid": push_userid, "push_content": push_content, "push_time": push_time}
if push_tag == "推 ":
    push_dic.append(dict1)
if push_tag == "→ ":
    arrow_dic.append(dict1)
if push_tag == "噓 ":
    shu_dic.append(dict1)

自動換頁

現在雖然可以抓下文章清單中的資料了,但只有第一頁的文章而已,要怎麼樣才能抓其他頁的文章呢??

想一下,我們想要看上一頁時,會做什麼事?
廢話! 當然就是按 "上頁" 按鈕阿!

對上方導覽列的 "上頁" 按鈕右鍵>>檢查,上一頁的連結就在string="‹ 上頁"<a>中。

更新url變數,然後用for迴圈想抓幾頁就抓幾頁!

url = "https://www.ptt.cc/"+soup.find("a", string="‹ 上頁")["href"]

json

目前都只是將抓到的資料印在terminal上,如果之後要用到這些資料做後續分析的話,就很不方便了,所以我們要將資料轉成json格式並存在電腦中。

json畢竟是第一次提到,還是來介紹一下什麼是json。

JSON(JavaScript Object Notation)是由道格拉斯·克羅克福特構想和設計的一種輕量級資料交換格式。其內容由屬性和值所組成,因此也有易於閱讀和處理的優勢。
JSON是獨立於程式語言的資料格式,其不僅是JavaScript的子集,也採用了C語言家族的習慣用法,目前也有許多程式語言都能夠將其解析和字串化,其廣泛使用的程度也使其成為通用的資料格式。

-- 維基百科

另外,python和json格式上有很高的對應關係。底下是兩者各自對應到的物件。

所以,我們要做的前置作業就是把資料整理好,以利將其轉成json檔。剛才也看到了python和json格式上的對應關係,這裡只要將資料整理成由list和dictionary所組成的複合型態就好了。

json資料的架構:

程式碼:

data = []   # 全部文章的資料
article_data = {}   # 單篇文章的資料
comment_dic = {}   # 所有留言

article_data["author"] = author
article_data["title"] = title
article_data["time"] = time
article_data["content"] = content
comment_dic["推"] = push_dic
comment_dic["→"] = arrow_dic
comment_dic["噓"] = shu_dic
article_data["comment"] = comment_dic

data.append(article_data)

更佛心的是,Python內建有json套件,利用dump()這個函數就能將其轉成json格式並匯出囉!

# 輸出JSON檔案
with open('data.json', 'w', encoding='utf-8') as file:
    json.dump(data, file)

執行後,在同個目錄下就會出現data.json這個檔案,用記事本打開後如果有東西那就是成功了。

不過看到的應該是一大串編碼,沒辦法知道資料是不是對的,這邊偷偷告訴你一個好康的,到 json editor 這個網站,幫你將json資料轉為樹狀顯示,就可以很方便的確認資料是否正確~

點 "Open from disk" 就可以匯入剛才的json檔囉。

完整程式碼請到GitHub上面看~ (不想貼出來佔空間了)

小結

PTT八卦板爬蟲就教到這邊,希望大家看完後對爬蟲都已經有一些基礎的認知了,明天起就會搭配專題介紹比較進階的爬蟲技巧,讓你體會到爬蟲真正的強大之處,我認為應該是比較有趣的部分,大家敬請期待~


如果喜歡這系列文章麻煩幫我按Like加訂閱,你的支持是我創作最大的動力~

本系列文章以及範例程式碼都同步更新在GitHub上,後續會持續的更新,如果喜歡也麻煩幫我按個星星吧~


上一篇
Day 18:專案03 - PTT 八卦版爬蟲03 | 文章標題、作者、時間
下一篇
Day 20:專案04 - Facebook爬蟲01 | ChromeDriver、Selenium
系列文
從HTML到Python爬蟲的30天之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言